#include <errno.h>
//
#include <machine/param.h>
#include <sys/ipc.h>
#include <sys/shm.h>
//
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
//
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/un.h>
#include <unistd.h>
//
#include <time.h>
//
#include <signal.h>
//
#include <fcntl.h>
#include <sys/stat.h>
//
int main(int argc, char *argv[]){
  
  int *p;
  int shmid;
  int wsz;
  if(argc<2){
    printf("gimme shmid [fout size]\n");
    exit(1);
  }
  shmid=atoi(argv[1]);
  p = ( int  * ) shmat ( shmid, ( void * ) 0, 0 );
  if(p==(int *)-1){
    perror("shmat");
    exit(1);
  }
  p--;
  int k=0;
  if(argc==2){
    do{
      printf("[%8.8x]: ",k);
      p++;
      printf("%8.8x ",*p);
      p++;
      printf("%8.8x\n",*p);
      k+=8;
    }while(1);
  }else if(argc==4){
    wsz=strtol(argv[3],NULL,10);
    if(wsz<=0){
      fprintf(stderr,"Invalid size\n");
      exit(1);
    }
    int d=open(argv[2],O_WRONLY|O_CREAT|O_TRUNC,S_IRUSR|S_IWUSR|S_IRGRP);
    if(d==-1){
      perror("open");
      exit(1);
    }
    do{
      p++;
      write(d,p,sizeof(int));
      k+=sizeof(int);
      if(k==wsz) break;
    }while(1);
  }
  exit(0);
}
